package threaduse;

/**
 * @author DCSGO
 * @version 1.0
 * 线程应用案例1 继承Thread类
 * 1.请编写程序，开启一个线程，该线程每隔1秒
 * 在控制台输出 "旺旺，我是小狗狗"
 * 2.对上题进行改进：当输出80次 后结束该线程
 * 3.使用JConsole监控线程执行情况(终端输入 jconsole 本地连接 Thread01)
 */
public class Thread01 {
    public static void main(String[] args) throws InterruptedException {
        Dog dog = new Dog();
        dog.start();//启动线程 最终会执行 dog.run()
        //为啥不直接调用 dog.run() ?
        //因为直接调用 dog.run() 就相当于调用一个普通方法了 没有了多线程的效果!
        //当 run 执行完毕后才会执行后面的 println for

        /*
         public synchronized void start() {
            ......
            start0();
            ......
         }
         private native void start0();
         本地方法 由 JVM 调用 底层是C/C++实现
         真正实现多线程效果的是 start0 而不是 run
         */

        System.out.println("main Thread: " + Thread.currentThread().getName());
        for (int i = 0; i < 60; i++) {
            System.out.println("main->i=" + i);
            Thread.sleep(1000);
        }
        /*
         * main Thread: main
         * main->i=0
         * Dog Thread: Thread-0
         * 旺旺，我是小狗狗1
         * main->i=1
         * 旺旺，我是小狗狗2
         * main->i=2
         * 旺旺，我是小狗狗3
         * main->i=3
         * 旺旺，我是小狗狗4
         * main->i=4
         * ......
         * 旺旺，我是小狗狗55
         * main->i=55
         * 旺旺，我是小狗狗56
         * 旺旺，我是小狗狗57
         * main->i=56
         * 旺旺，我是小狗狗58
         * main->i=57
         * main->i=58
         * 旺旺，我是小狗狗59
         * 旺旺，我是小狗狗60
         * main->i=59
         * 旺旺，我是小狗狗61
         * 旺旺，我是小狗狗62
         * 旺旺，我是小狗狗63
         * 旺旺，我是小狗狗64
         * ......
         * 旺旺，我是小狗狗79
         * 旺旺，我是小狗狗80
         */
        //既有同步 又有交替 最后仅剩 Thread-0
        //Thread-0 结束后 该进程也随之结束
        //子线程并不会阻塞主线程的执行
        //进程并不随着主线程的结束而结束 而是当所有线程结束后才结束
    }
}

class Dog extends Thread {//Dog 继承了 Thread 现在 Dog 就可以看做是一个线程了

    @Override
    public void run() {//重写 run 方法 里面写上我们自己想实现的 业务逻辑
        //获取当前线程名
        System.out.println("Dog Thread: " + Thread.currentThread().getName());

        int runtimes = 0;
        while (true) {
            System.out.println("旺旺，我是小狗狗" + (++runtimes));
            try {
                //让线程休眠1000毫秒(1秒)
                Thread.sleep(1000);//需要处理异常
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (runtimes == 80) {
                break;
            }
        }
    }
}